<?php
namespace App\Common\Cla\ClaBase\Traits\Common;

use App\Common as com;
use App\Common\Cla\ClaBase\Traits\Common as clac;
/**
 * 
 * @author GJJ95
 * @property 
 */
trait MagicGather {
	
	private $_magicGatherObj = null;
	
	/** 魔术方法迭代列表 */
	private $_magicGatherLists = [
		'get' => [
			'is_init' => 0,
			'event' => []
		],
		'set' => [
			'is_init' => 0,
			'event' => []
		],
		'call' => [
			'is_init' => 0,
			'event' => []
		]
	];
	
	/**
	 * 获取功能集对象
	 * @return \App\Common\Cla\ClaBase\Traits\Common\MagicGather\Main
	 */
	private function _magicGather(){
		if( $this->_magicGatherObj === null ){
			$this->_magicGatherObj = new clac\MagicGather\Main( $this );
		}
		//
		return $this->_magicGatherObj;
	}
	
	/**
	 * 初始化功能集对象
	 */
	private function _magicGatherInit(){
		$this->_magicGather();
	}
	
	/**
	 * 初始化功能集->get对象
	 * @return int [0]初始化失败 [1]初始化成功
	 */
	private function _magicGatherInitOfGet(){
		$this->_magicGatherInit();
		//
		if( ! $this->_magicGatherLists['get']['is_init'] ){
			$this->_magicGather()->get();
			$this->_magicGatherLists['get']['is_init'] = 1;
		}
		//
		return 1;
	}

	/**
	 * 初始化功能集->set对象
	 * @return int [0]初始化失败 [1]初始化成功
	 */
	private function _magicGatherInitOfSet(){
		$this->_magicGatherInit();
		//
		if( ! $this->_magicGatherLists['set']['is_init'] ){
			$this->_magicGather()->set();
			$this->_magicGatherLists['set']['is_init'] = 1;
		}
		//
		return 1;
	}
	
	/**
	 * 初始化功能集->call对象
	 * @return int [0]初始化失败 [1]初始化成功
	 */
	private function _magicGatherInitOfCall(){
		$this->_magicGatherInit();
		//
		if( ! $this->_magicGatherLists['call']['is_init'] ){
			$this->_magicGather()->call();
			$this->_magicGatherLists['call']['is_init'] = 1;
		}
		//
		return 1;
	}
	
	/**
	 * 魔术方法->get
	 * @param str $name 方法名
	 * @param array $arguments 参数
	 * @return mixed||Exception 返回数据(可能抛出的异常:[其他]com\Cla\Err\Code::$sysFunExecuteError)
	 */
	public function __get( $name )
	{
		$this->_magicGatherInitOfGet();
		// 循环事件
		foreach( $this->_magicGatherLists['get']['event'] as $magic_callback ){
			$magic_return = $magic_callback( $name );
			if( $magic_return !== com\Lib\Com\Code::$varCustomNull ) return $magic_return;
		}
		//
		throw com\Lib\Err\Exception::makeOfNew( '', com\Cla\Err\Code::$sysFunExecuteError );
	}
	
	/**
	 * 魔术方法->set
	 * @param str $name 方法名
	 * @param array $arguments 参数
	 * @return mixed||Exception 返回数据(可能抛出的异常:[其他]com\Cla\Err\Code::$sysFunExecuteError)
	 */
	public function __set( $name, $value )
	{
		$this->_magicGatherInitOfSet();
		// 循环事件
		foreach( $this->_magicGatherLists['set']['event'] as $magic_callback ){
			$magic_return = $magic_callback( $name, $value );
			if( $magic_return === true ) return;
		}
		//
		throw com\Lib\Err\Exception::makeOfNew( '', com\Cla\Err\Code::$sysFunExecuteError );
	}
	
	/**
	 * 魔术方法->call
	 * @param str $name 方法名
	 * @param array $arguments 参数
	 * @return mixed||Exception 返回数据(可能抛出的异常:[其他]com\Cla\Err\Code::$sysFunExecuteError)
	 */
	public function __call( $name, $arguments )
	{
		$this->_magicGatherInitOfCall();
		// 循环事件
		foreach( $this->_magicGatherLists['call']['event'] as $magic_callback ){
			$magic_return = $magic_callback( $name, $arguments );
			if( $magic_return !== com\Lib\Com\Code::$varCustomNull ) return $magic_return;
		}
		//
		throw com\Lib\Err\Exception::makeOfNew( '', com\Cla\Err\Code::$sysFunExecuteError );
	}
	
	/**
	 * 魔法集api
	 * @param str $api_name api名
	 * @param array ...$args api参数
	 * @return mixed api返回值
	 */
	public function _magicGatherApi( $api_name, array $args = [] ){
		$api_callname = '_magicGatherApiOf' . $api_name;
		return $this->$api_callname( ...$args );
	}
	
	/**
	 * 注册魔术方法事件
	 * @param string $magic_type 魔术方法类型
	 * @param string $callback_sid 回调sid
	 * @param \Closure $callback 回调
	 * @return int 添加结果。[0]添加失败 [1]添加成功
	 */
	private function _magicGatherApiOfRegisterMagicEvent( $magic_type, string $callback_sid, \Closure $callback ){
		$this->_magicGatherLists[ $magic_type ]['event'][ $callback_sid ] = $callback;
		//
		return 1;
	}
	
	/**
	 * 类方法是否存在
	 * @param str $method_name 方法名
	 * @return bool [false]不存在 [true]存在
	 */
	private function _magicGatherApiOfMethodExists( $method_name ){
		return method_exists( $this, $method_name);
	}
	
	/**
	 * 调用类方法
	 * @param str $method_name 方法名
	 * @param array ...$args 方法参数
	 * @return mixed 方法返回值
	 */
	private function _magicGatherApiOfMethodCall( $method_name, array $args = [] ){
		return $this->$method_name( ...$args );
	}
	
	/**
	 * 检查属性是否存在
	 * @param str $propertyName 属性名
	 * @return bool [false]不存在 [true]存在
	 */
	private function _magicGatherApiOfPropertyExists( $property_name ){
		return property_exists( $this, $property_name );
	}
	
	/**
	 * 检查属性是否已设置（调用isset方法）
	 * @param str $propertyName 属性名
	 * @return bool [false]不存在 [true]存在
	 */
	private function _magicGatherApiOfPropertyIsset( $property_name ){
		return isset( $this->$property_name);
	}
	
	/**
	 * 获取属性值
	 * @param str $propertyName 属性名
	 * @return mixed 属性值
	 */
	private function _magicGatherApiOfPropertyGet( $property_name){
		return $this->$property_name;
	}
	
	/**
	 * 设置属性值
	 * @param str $propertyName 属性名
	 * @param mixed $value 属性值
	 * @return void
	 */
	private function _magicGatherApiOfPropertySet( $property_name, $value ){
		$this->$property_name = $value;
	}
	
}
